home *** CD-ROM | disk | FTP | other *** search
/ MacWorld: Complete Mac Interactive / Macworld Complete Mac Interactive CD)(1994).iso / The Best of BMUG / Utilities / Text and Speech / Alpha.5.76 / Tcl / SystemCode / procs.tcl < prev    next >
Text File  |  1994-03-16  |  18KB  |  744 lines

  1. #==============================================================================
  2. proc normalLeftBracket {} {
  3.     insertText "\{"
  4. }
  5. proc normalRightBracket {} {
  6.     insertText "\}"
  7. }
  8. bind '\[' <zs>  normalLeftBracket
  9. bind '\]' <zs>  normalRightBracket
  10.             
  11. # Select the next or current word. If word already selected, will go to next.
  12. proc hiliteWord {} {
  13.     if {[getPos]!=[selEnd]}    forwardChar
  14.     forwardWord
  15.     set start [getPos]
  16.     backwardWord
  17.     select $start [getPos]
  18. }
  19.  
  20. bind 'h' <z> hiliteWord
  21.  
  22. #================================================================================
  23. # Mode variables
  24. #================================================================================
  25. # For mark stack.
  26. set markName 0
  27. set markStack ""
  28.  
  29. # mapping of windows to current modes.
  30. set winModes("") ""
  31.  
  32. # making vars local to windows
  33. set localVars { optionIsMeta wordBreak wordBreakPreface wordWrap 
  34.     fillColumn leftFillColumn tabSize elecLBrace elecRBrace electricSemi 
  35.     prefixString suffixString funcExpr funcPar sortedIsDefault 
  36.     markSorting }
  37.  
  38. # 'incomingVars' used to hold old var values that have been overwritten in current window
  39.  
  40. #================================================================================
  41. # Handle 'flag' and 'var' menu selections.
  42. #================================================================================
  43. proc editFlag {menu item} {
  44.     global $item localVars incomingVars
  45.  
  46.     set val [expr ([set $item]-1)*-1]
  47.     markMenuItem $menu $item [expr ([set $item])?"on":"off"]
  48.     set $item $val
  49. }
  50.  
  51. proc editVar {menu item} {
  52.     global $item localVars incomingVars
  53.  
  54.     append prmpt "New Value of " $item ": "
  55.     if ![catch {prompt $prmpt [set $item]} res] {
  56.         set $item $res
  57.     }
  58. }
  59.  
  60.  
  61. #=============================================================================
  62. # Hook procs recognized: "openHook", "closeHook", "activateHook", "deactivateHook", 
  63. #                          "suspendHook", "saveasHook", "saveHook", and "resumeHook".
  64. #=============================================================================
  65.  
  66. # Event hooks - set specific modes when files opened.
  67. proc openHook name {
  68.     global winModes
  69.     $winModes($name)
  70.     if {$name == {*Toolserver shell*}} startMPW
  71.     addWinName $name
  72. }
  73.  
  74. # full pathname
  75. proc saveHook name {
  76.     global backup backExtension backDir
  77.     if {![string length [set dir $backDir]]} {
  78.         set dir [file dirname $name]
  79.     }
  80.     if ($backup) {
  81.         catch {rm $dir:[file tail $name]~}
  82.         cp $name $dir:[file tail $name]$backExtension
  83.     }
  84. }
  85.  
  86. # Clean up the mark stack.
  87. proc closeHook name {
  88.     global markStack
  89.     global winModes
  90.     unset winModes($name)
  91.     if [llength $markStack] {
  92.         set markStack [removePat $markStack $name*]
  93.     }
  94.     removeWinName $name
  95. }
  96.  
  97. proc saveasHook {oldName newName} {
  98.     global winModes
  99.     removeWinName $oldName
  100.     addWinName $newName
  101.     setWinMode $newName
  102.     $winModes($newName)
  103. }
  104.  
  105.  
  106. proc activateHook name {
  107.     global winModes
  108.     if {[catch {$winModes($name)}]} {
  109.         setWinMode $name
  110.         $winModes($name)
  111.     }
  112. }
  113.  
  114. proc dirtyHook {name dirty} {
  115.     global winMenu
  116.     markMenuItem $winMenu [file tail $name] $dirty "◊"
  117. }
  118.  
  119.  
  120. #================================================================================
  121.  
  122.  
  123. proc setWinMode name {
  124.     global winModes
  125.     set nm [file tail $name]
  126.     if {[set first [string last " <" $name]] >= 0} {
  127.         set rname [string range $name 0 [expr $first - 1]]
  128.     } else {
  129.         set rname $name
  130.     }
  131.     case $rname in {
  132.         "*.c"         {     set winModes($name) setCMode }
  133.         "*.tex"        {     set winModes($name) setTexMode; winFuncTitle $nm "Sect" }
  134.         "*.cc"        {     set winModes($name) setC++Mode; winFuncTitle $nm "Meth" }
  135.         "*.cp"        {     set winModes($name) setC++Mode; winFuncTitle $nm "Meth" }
  136.         "*.C"        {     set winModes($name) setC++Mode; winFuncTitle $nm "Meth" }
  137.         "*.h"         {     set winModes($name) setCMode }
  138.         "*.f"          {     set winModes($name) setFortranMode }
  139.         "*.tcl"     {     set winModes($name) setTclMode; winFuncTitle $nm "Proc" }
  140.         {*Toolserver\ sh*}    {     set winModes($name) setMPWMode; winFuncTitle $nm "Proc" }
  141.         {*tcl\ sh*}    {     set winModes($name) setShellMode; winFuncTitle $nm "Proc" }
  142.         "*.sty"        {     set winModes($name) setTexMode; winFuncTitle $nm "Sect" }
  143.         "Browser"    {     set winModes($name) setBrowseMode }
  144.         default        {     set winModes($name) setTextMode }
  145.     }
  146. }
  147.  
  148.  
  149. # 'modes' is inspected by alpha for the popup mode menu. 'newMode' is 
  150. # called by Alpha in case of a successful choice.
  151. set modes { C C++ Csh Fort MPW Tcl TeX Text }
  152.  
  153. set modeProcs(C)         setCMode
  154. set modeProcs(C++)         setC++Mode
  155. set modeProcs(Csh)         setShellMode
  156. set modeProcs(Fort)     setFortranMode
  157. set modeProcs(MPW)         setMPWMode
  158. set modeProcs(Tcl)         setTclMode
  159. set modeProcs(TeX)         setTexMode
  160. set modeProcs(Text)     setTextMode
  161.  
  162. proc newMode mode {
  163.     global winModes
  164.     global modeProcs
  165.     
  166.     set name [lindex [winNames -f] 0]
  167.     $modeProcs($mode)
  168.     set winModes($name) $modeProcs($mode)
  169. }
  170.  
  171.  
  172. proc deactivateHook name {
  173. }
  174.  
  175. proc suspendHook name {
  176.     global iconifyOnSwitch
  177.     global suspIconed
  178.     if {$iconifyOnSwitch} {
  179.         set wins [winNames -f]
  180.         foreach win $wins {
  181.             if {![icon -f "$win" -q]} {
  182.                 set suspIconed($win) 1
  183.                 icon -f "$win" -t
  184.             }
  185.         }
  186.     }
  187. }
  188.  
  189. proc resumeHook name {
  190.     global iconifyOnSwitch resumeRevert suspIconed
  191.     if {$iconifyOnSwitch && [info exists suspIconed]} {
  192.         set wins [winNames -f]
  193.         foreach win [array names suspIconed] {
  194.             icon -f "$win" -o
  195.         }
  196.         unset suspIconed
  197.     }
  198.     if {$resumeRevert} {
  199.         set resumeRevert 0
  200.         revert
  201.     }
  202. }
  203.  
  204. # Called prior to Alpha calling 'MenuSelect'. Redefined in 'flags.tcl'.
  205. proc menuHook {} {
  206.     
  207. }
  208.  
  209.  
  210. # Handles dynamically adding and deleting window names from menu.
  211. proc addWinName name {
  212.     global winNameToNum winMenu winNumToName fullNames
  213.     
  214.     for {set i 0} {$i<100} {incr i} {
  215.         if {[catch {set nm $winNumToName($i)} res] == "1"} {
  216.             if {$fullNames != "0"} {
  217.                 set nm $name
  218.             } else {
  219.                 regexp {[^:]*$} $name nm
  220.             }
  221.             if {$i < 10} {
  222.                 addMenuItem -m -l "/$i" $winMenu $nm
  223.             } else {
  224.                 addMenuItem -m -l "" $winMenu $nm
  225.             }
  226.             set winNumToName($i) $name
  227.             set winNameToNum($name) $i
  228.             return
  229.         }
  230.     }
  231. }
  232.  
  233. proc removeWinName name {
  234.     global winNameToNum winNumToName fullNames winMenu
  235.     
  236.     set num $winNameToNum($name)
  237.     unset winNumToName($num)
  238.     unset winNameToNum($name)
  239.     if {$fullNames == "1"} {
  240.         deleteMenuItem -m $winMenu $name
  241.     } else {
  242.         regexp {[^:]*$} $name nm
  243.         deleteMenuItem -m $winMenu $nm
  244.     }
  245. }
  246.  
  247.  
  248. proc menuWin {menu name} {
  249.     global winNameToNum
  250.  
  251.     set nms [array names winNameToNum]
  252.     foreach nm $nms {
  253.         if {[string match *$name $nm] == "1"}  {
  254.             bringToFront $name
  255.             if [icon -q] { icon -f $name -o }
  256.             return
  257.         }
  258.     }
  259.     return "normal"
  260. }
  261.  
  262.  
  263. set lastMode 0
  264.  
  265. # rta  Creating texWasLast variable
  266. set texWasLast 0
  267. # rta Following changed from ThinkC to MPW
  268.  
  269.  
  270. # Modes
  271.  
  272. # Fortran programming mode 
  273. proc setFortranMode {} {
  274.     changeMode "Fort"
  275.     uplevel #0 {
  276.         set elecLBrace 0
  277.         set elecRBrace 0
  278.         set electricSemi 0
  279.         set wordWrap 0
  280.         set funcExpr {^(      |\t)(subroutine|.*function|SUBROUTINE|.*FUNCTION).*\(.*$}
  281.         set sortedIsDefault 0
  282.     }
  283. }
  284.  
  285.  
  286. # Ordinary, default mode
  287. proc setTextMode {} {
  288.     changeMode "Text"
  289.     uplevel #0 {
  290.         set elecLBrace 0
  291.         set elecRBrace 0
  292.         set electricSemi 0
  293.         set wordWrap 1
  294.         set prefixString "> "
  295.         set suffixString " <--"
  296.     }
  297. }
  298.  
  299.  
  300. #================================================================================
  301.  
  302. # Instantiate a global variable to the path of a file (usually an app). As a
  303. # side-effect, make the instantiation permanent by adding a line to 'definitions.tcl'.
  304. proc addAppPath {name var} {
  305.     global $var
  306.     
  307.     if {[catch {getfile "Find '$name' app:"} path]} {return 1}
  308.     set $var $path
  309.  
  310.     addUserLine "set $var \"[quoteExpr2 $path]\""
  311.     return 0
  312. }
  313.  
  314. proc addUserLine {line} {
  315.     global HOME
  316.  
  317.     if {[file exists "$HOME:userStartup.tcl"]} {
  318.         set fid [open "$HOME:userStartup.tcl" "a"]
  319.     } else {
  320.         set fid [open "$HOME:userStartup.tcl" "w"]
  321.     }
  322.     puts $fid $line
  323.     close $fid
  324. }
  325.  
  326.  
  327. proc getFileSig {f} {
  328.     catch {lindex [ls -l $f] 5} var
  329.     return $var
  330. }
  331.  
  332.  
  333. # Look for given app sig in active processes. If not there, try to 
  334. # launch with 'path' prompting for 'path' if necessary.
  335. # Return the real name of the app. Don't switch.
  336. proc checkRunning {name sig path} {
  337.     global $path
  338.     foreach proc [processes] {
  339.         if {[lindex $proc 1] == $sig} {
  340.             return [lindex $proc 0]
  341.         }
  342.     }
  343.     if {![info exists $path] || ![file exists [set $path]]} {
  344.         if {[addAppPath $name $path]} return
  345.     }
  346.     if {[catch {getFileSig [set $path]}]} {
  347.         if {[addAppPath $name $path]} return
  348.     }
  349.     set sig [getFileSig [set $path]]
  350.     if {[catch {launch -f [set $path]}]} {
  351.         error "Problem with script."
  352.     }
  353.     return [file tail [set $path]]
  354. #    return [checkRunning $name $sig $path]
  355. }
  356.  
  357. #================================================================================
  358. # Excalibur is the only Mac spell-checker that I know of which will handle LaTeX as
  359. # well as ordinary text.
  360.  
  361.  
  362. proc spellcheckWindow {} {
  363.     global excaliburPath resumeRevert
  364.  
  365.     catch {checkRunning Excalibur XCLB excaliburPath} name
  366.  
  367.     if {[winInfo dirty]} {
  368.         if {[askyesno "Save '[lindex [winNames] 0]'?"] == "yes"} {
  369.             save
  370.         }
  371.     }
  372.     if {[catch {sendOpenEvent -n $name [lindex [winNames -f] 0]}] } {
  373.         beep 
  374.     } else {
  375.         switchTo $name
  376.     }
  377.     set resumeRevert 1
  378. }
  379.  
  380. proc spellcheckSelection {} {
  381.     global excaliburPath 
  382.  
  383.     catch {checkRunning Excalibur XCLB excaliburPath} name
  384.  
  385.     if {[getPos] == [selEnd]} {
  386.         beep
  387.         message "No selection"
  388.         return;
  389.     }
  390.     copy
  391.     switchTo $name
  392. }
  393.  
  394. #================================================================================
  395.  
  396.  
  397. proc changeMode {newMode} {
  398.     global lastMode
  399.     global savedIsMeta
  400.     global wordBreak
  401.     global wordBreakPreface
  402.     global optionIsMeta
  403.     global latexMenu thinkMenu
  404.     
  405.     displayMode $newMode
  406.     if {$lastMode == $newMode} return
  407.     
  408.     case $lastMode in {
  409.         "TeX" {
  410.             set optionIsMeta $savedIsMeta
  411.             set wordBreakPreface {[^a-zA-Z0-9_]}
  412.             set wordBreak {[a-zA-Z0-9_]+}
  413.             set optionIsMeta 1
  414.             catch {removeMenu $latexMenu}
  415.         }
  416.         "Csh" {
  417.             catch {removeMenu "Tcl"}
  418.         }
  419.         "Tcl" {
  420.             catch {removeMenu "Tcl"}
  421.         }
  422.         "BRWZ" {
  423.             catch {removeMenu "Browse"}
  424.         }
  425.         "C" {
  426.             catch {removeMenu    $thinkMenu}
  427.         }
  428.          "C++" {
  429.             catch {removeMenu    $thinkMenu}
  430.         }
  431.     }
  432.     global mode
  433.     set mode $newMode
  434.     set lastMode $newMode
  435. }
  436.     
  437.  
  438. proc alphaHelp {} {
  439.     global HOME
  440.     edit -r -m "$HOME:Help:Alpha Commands"
  441. }
  442.  
  443.  
  444. proc tclHelp {} {
  445.     global HOME
  446.     edit -r -m "$HOME:Help:Tcl Commands"
  447. }
  448.  
  449.  
  450. set patternLibrary {
  451.     { "Pascal to C Comments" {        \{([^\}]*)\}} {/* \1 */} }
  452.     { "C++ to C Comments" {//(.*)} {/* \1 */}}
  453. }
  454.  
  455.  
  456. proc dividingLine {} {
  457.     insertText "================================================================================\r"
  458. }
  459. bind 'l' <C> dividingLine
  460.  
  461. proc texDividingLine {} {
  462.     insertText "%================================================================================\r"
  463. }
  464. bind 'l' <C> texDividingLine TeX
  465.  
  466. proc cDividingLine {} {
  467.     insertText "//================================================================================\r"
  468. }
  469. bind 'l' <C> cDividingLine C
  470. bind 'l' <C> cDividingLine C++
  471.  
  472. proc tclDividingLine {} {
  473.     insertText "#================================================================================\r"
  474. }
  475. bind 'l' <C> tclDividingLine Tcl
  476.  
  477.  
  478. #================================================================================
  479.  
  480. if {[catch {info args oldCd}]} {
  481.     rename cd oldCd
  482. }
  483.  
  484. proc cd args {
  485.     global HOME
  486.     if {[llength $args]} {
  487.         oldCd [string trim [eval list $args] "        \{\}"]
  488.     } else {
  489.         oldCd $HOME
  490.     }
  491. }
  492.  
  493. #================================================================================
  494.  
  495. proc getVarValue {} {
  496.     set val [listpick -p {Which var?} [lsort [info globals]]]
  497.     if {![string length $val]} return
  498.     global $val
  499.     alertnote [join [list "'$val' = " [set $val]] ""]
  500. }
  501.  
  502. #================================================================================
  503.     
  504. proc selectParagraph {} {
  505.     set pos [getPos]
  506.     set start [paraStart $pos] 
  507.     set finish [paraFinish $pos]
  508.     goto $start
  509.     select $start $finish
  510. }
  511.  
  512. # wrapText ==  getText ; breakIntoLines ; replaceText
  513. # Remove text from window, transform (join, del-ws), insert back into window.
  514. proc fillTextByPar {from to} {
  515.     set text [getText $from $to]
  516.     regsub -all "\r(\[ \t\]*\r)+" $text "\r\r\r" text
  517.     regsub -all "(\[^\r\])\r" $text "\\1 " text
  518.     regsub -all "\[ \t\]+" $text " " text
  519.     return [breakIntoLines $text]
  520. }
  521.  
  522. proc fillRegionByPar {{start -1} {finish -1}} {
  523. #    # if {[getPos] == [selEnd]} { return}
  524.     if {($start < 0) || ($finish < 0)} {
  525.         set start [lineStart [getPos]]
  526.         set finish [selEnd] }
  527.     if {$start >= $finish} return
  528.     goto $start
  529.     set text [fillTextByPar $start $finish]
  530.     replaceText $start $finish $text "\r"
  531. }
  532.     
  533. #
  534. # join Lines in region -- if no optional args, use selection
  535. #
  536. proc joinRegion {{from -1} {to -1}} {
  537.     if {($from < 0) || ($to < 0)} {    set from [getPos] ; set to [selEnd] }
  538.     if {$from >= $to} return
  539.     set text [getText $from $to]
  540.     regsub -all "\r(\[ \t\]*\r)+" $text "\r\r\r" text
  541.     regsub -all "(\[^\r\])\r" $text "\\1 " text
  542.     replaceText $from $to $text "\r"
  543. }
  544. # WARNING:    regsub ^$ refers to string endpts (not lines)
  545. # FUTURE:    filterLines like perl:
  546. #    replaceText[apply_to_all(cmd,split [getText [getPos] [selEnd]] "\r")]
  547. # OR:    replaceInRegion: dup_\r, $=>\r ??
  548. #
  549.  
  550.  
  551. #
  552. # Remove text from window, transform (delete dup ws), insert back into window.
  553. #
  554. # inputs: message, alertnote, askyesno, listpick, prompt KILLS SELECTION.
  555. # search: bnds = search -forward -regExpr -ignoreCase -matchWords -noabort 
  556. #        -l limit pat pos
  557. proc regsubInRegion {from to srch repl} {
  558.     if {![string length $srch]} return
  559.     if {$from >= $to} return
  560.     set text [getText $from $to]
  561.     regsub -all "$srch" $text "$repl" text
  562.     replaceText $from $to $text
  563. }
  564. #    while {($pos < $to) &&
  565. #          ![catch {search -f 1 -r 1 -i 1 -m 0 "$srch" $pos} mtch]} {
  566. #        set mbeg [lindex $mtch 0]
  567. #        set pos [lindex $mtch 1]
  568. #        replaceText $mbeg $pos $repl }
  569.  
  570. proc backSlashSub {arg} { eval [concat return "\"$arg\""] }
  571.  
  572. proc replaceInRegion {} {
  573.     if [catch {prompt "Search RegExpr:" ""} srch] return
  574.     if [catch {prompt "Replace String:" ""} repl] return
  575.     if {![string length $srch]} return
  576.     regsubInRegion [getPos] [selEnd] \
  577.         [backSlashSub "$srch"] [backSlashSub "$repl"]
  578. }
  579.  
  580. #
  581. # Apply command to each line (or paragraph) in selection ;
  582. #    if no cmd arg then prompts for it
  583. #
  584. proc filterLines {{cmd 0} {parunit 0}} {
  585.     if {$cmd == 0} {
  586.       if {[catch { prompt "Line-filter command: " "" } cmd]} { return } }
  587.     if {![string length $cmd]} return
  588.     set unitStart lineStart
  589.     set unitEnd nextLineStart
  590.     if {$parunit} {
  591.         set unitStart paraStart
  592.         set unitEnd paraFinish }
  593.     set pos [$unitStart [getPos]]
  594.     set finish [selEnd]
  595.     if {$pos >= $finish} return
  596.     goto $pos
  597.     createTMark "filterLend" $finish
  598.     set next [$unitEnd $pos]
  599.     while {(($next > $pos) && ($pos < $finish))} {
  600.         goto [expr $next-1]
  601.         createTMark "filterLnext" $next
  602.         setMark
  603.         goto $pos
  604.         markHilite
  605.         if {[catch [list uplevel #0 "$cmd"] retval]} {
  606.             select $pos $finish
  607.             alertnote $retval
  608.             return
  609.         }
  610.         if {$next==$finish} break
  611.         set ind [lsearch -regexp [lindex [getTMarks] 0] "filterLend.*"]
  612.         set finish [lindex [lindex [lindex [getTMarks] 0] $ind] 2]
  613.         gotoTMark "filterLnext"
  614.         set pos [$unitStart [getPos]]
  615.         set next [$unitEnd $pos]
  616.     }
  617.     removeTMark "filterLend"
  618.     removeTMark "filterLnext"
  619. }
  620.  
  621.  
  622. proc filterParagraphs {{cmd 0}} { filterLines $cmd 1 }
  623.  
  624. # WARNING: deselecting sets the mark to selEnd
  625. proc sortParagraphs {{from -1} {to -1}} {
  626.     if {($from < 0) || ($to < 0)} {    set from [getPos] ; set to [selEnd] }
  627.     if {$from >= $to} return
  628.     joinRegion {$from $to}
  629.     select [getPos] [nextLineStart [getMark]]
  630.     sortLines
  631.     select [getPos] [getPos]
  632.     regsubInRegion [getPos] [getMark] "\r" "\r\r" 
  633.     wrapRegion
  634. }
  635.  
  636. #
  637. # Sample
  638. #
  639. proc filterRegion {{from -1} {to -1} {cmd 0} {newwin 0}} {
  640.     if {$cmd == 0} {
  641.       if {[catch { prompt "Eval command: " "" } cmd]} { return }
  642.     }
  643.     if {![string length $cmd]} return
  644.     if {($from < 0) || ($to < 0)} {    set from [getPos] ; set to [selEnd] }
  645.     if {$from >= $to} return
  646.     set pos [getPos]
  647.     set text [getText $from $to]
  648.     set text [$cmd $text]
  649.     replaceText $from $to $text "\r"
  650.     goto $pos
  651. }
  652.  
  653. #===========================
  654. # ==== FUNCTIONS (COMMANDS)
  655. #===========================
  656. # ==== Redo History ====
  657. set evalLastCmd ""
  658.  
  659. # Eval one command --- "eval" vs. "catch"
  660. #    # catch:  0_OK == catch cmd retval
  661. #    # set retval [eval [list uplevel #0 "$cmd"]]
  662. #    # catch [list uplevel #0 "$cmd"] retval
  663. #
  664. proc evalCommand {} {
  665.     global evalLastCmd
  666.     if {![catch { prompt "Eval command: " "" } cmd]} {
  667.         set evalLastCmd $cmd
  668.         set retval [eval [list uplevel #0 "$cmd"]]
  669.         message $retval }
  670. }
  671.  
  672. proc evalToText {} {
  673.     global evalLastCmd
  674.     if {![catch { prompt "Eval command: " "" } cmd]} {
  675.         set evalLastCmd $cmd
  676.         catch [list uplevel #0 "$cmd"] retval
  677.         getline "Result:" "$retval" }
  678. }
  679.  
  680. # repeat complex command
  681. proc repeatEval {} {
  682.     global evalLastCmd
  683.     set cmd $evalLastCmd
  684.     if {$cmd == ""} { abortEm ; return }
  685.     set retval [eval [list uplevel #0 "$cmd"]]
  686.     message $retval
  687. }
  688.  
  689. #    Escape current mode for one command
  690. proc execCommand {} {
  691.     global mode
  692.     set saveMode $mode
  693.     changeMode "Text"
  694.     execute
  695.     changeMode $saveMode
  696. }
  697.  
  698. # First, define macros to bypass the electric braces.
  699. proc ordLeftBrace {} {
  700.     insertText "        \{"
  701. }
  702. bind {'['} <cs> ordLeftBrace
  703.  
  704. proc ordRightBrace {} {
  705.     insertText "\}"
  706.     blink [matchIt "\}" [expr [getPos]-1]]
  707. }
  708. bind {']'} <cs> ordRightBrace
  709.     
  710. proc quoteWord {} {
  711.     backwardWord
  712.     insertText "'"
  713.     forwardWord
  714.     insertText "'"
  715. }
  716. bind ''' <z> quoteWord
  717.  
  718. #================================================================================
  719.  
  720. proc tomac {fname} {
  721.     set fd [open $fname "r"]
  722.     set text [read $fd]
  723.     close $fd
  724.     set fd [open $fname "w"]
  725.     regsub "\n" $text "\r" text
  726.     puts -nonewline $fd $text
  727.     close $fd
  728. }
  729.  
  730. proc tounix {fname} {
  731.     set fd [open $fname "r"]
  732.     set text [read $fd]
  733.     close $fd
  734.     set fd [open $fname "w"]
  735.     regsub "\r" $text "\n" text
  736.     puts -nonewline $fd $text
  737.     close $fd
  738. }
  739.  
  740. #================================================================================
  741. # The following is useful to prompt for a fileset name, as for createTagFile.
  742. # eval [concat prompt Fileset? [list [lindex [array names fileSets] 0]] Sets: [array names fileSets]]
  743.